當前位置:首頁 » 文件管理 » resttemplate上傳文件

resttemplate上傳文件

發布時間: 2023-03-02 20:42:51

Ⅰ resttemplate怎麼上傳文件流

定義一個簡單的restful介面
@RestController
public class TestController
{
@RequestMapping(value = "testPost", method = RequestMethod.POST)
public ResponseBean testPost(@RequestBody RequestBean requestBean)
{
ResponseBean responseBean = new ResponseBean();
responseBean.setRetCode("0000");
responseBean.setRetMsg("succ");

return responseBean;
}
}

使用RestTemplate訪問該服務
//請求地址
String url = "";
//入參
RequestBean requestBean = new RequestBean();
requestBean.setTest1("1");
requestBean.setTest2("2");
requestBean.setTest3("3");

RestTemplate restTemplate = new RestTemplate();
ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class);

從這個例子可以看出,使用restTemplate訪問restful介面非常的簡單粗暴無腦。(url,
requestMap, ResponseBean.class)這三個參數分別代表 請求地址、請求參數、HTTP響應轉換被轉換成的對象類型。
RestTemplate方法的名稱遵循命名約定,第一部分指出正在調用什麼HTTP方法,第二部分指示返回的內容。本例中調用了restTemplate.postForObject方法,post指調用了HTTP的post方法,Object指將HTTP響應轉換為您選擇的對象類型。還有其他很多類似的方法,有興趣的同學可以參考官方api。
三.手動指定轉換器(HttpMessageConverter)
我們知道,調用reseful介面傳遞的數據內容是json格式的字元串,返回的響應也是json格式的字元串。然而restTemplate.postForObject方法的請求參數RequestBean和返回參數ResponseBean卻都是java類。是RestTemplate通過HttpMessageConverter自動幫我們做了轉換的操作。
默認情況下RestTemplate自動幫我們注冊了一組HttpMessageConverter用來處理一些不同的contentType的請求。
如StringHttpMessageConverter來處理text/plain;來處理application/json;來處理application/xml。
你可以在org.springframework.http.converter包下找到所有spring幫我們實現好的轉換器。
如果現有的轉換器不能滿足你的需求,你還可以實現org.springframework.http.converter.HttpMessageConverter介面自己寫一個。詳情參考官方api。
選好了HttpMessageConverter後怎麼把它注冊到我們的RestTemplate中呢。
RestTemplate restTemplate = new RestTemplate();
//獲取RestTemplate默認配置好的所有轉換器
List<HttpMessageConverter> messageConverters = restTemplate.getMessageConverters();
//默認的在第7個 先把它移除掉
messageConverters.remove(6);
//添加上GSON的轉換器
messageConverters.add(6, new GsonHttpMessageConverter());

這個簡單的例子展示了如何使用GsonHttpMessageConverter替換掉默認用來處理application/json的。
四.設置底層連接方式
要創建一個RestTemplate的實例,您可以像上述例子中簡單地調用默認的無參數構造函數。這將使用java.NET包中的標准Java類作為底層實現來創建HTTP請求。
但很多時候我們需要像傳統的HttpClient那樣設置HTTP請求的一些屬性。RestTemplate使用了一種很偷懶的方式實現了這個需求,那就是直接使用一個HttpClient作為底層實現......
//生成一個設置了連接超時時間、請求超時時間、異常最大重試次數的httpClient
RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(10000).setConnectTimeout(10000).setSocketTimeout(30000).build();
HttpClientBuilder builder = HttpClientBuilder.create().setDefaultRequestConfig(config).setRetryHandler(new (5, false));
HttpClient httpClient = builder.build();
//使用httpClient創建一個ClientHttpRequestFactory的實現
ClientHttpRequestFactory requestFactory = new (httpClient);
//ClientHttpRequestFactory作為參數構造一個使用作為底層的RestTemplate
RestTemplate restTemplate = new RestTemplate(requestFactory);

五.設置攔截器(ClientHttpRequestInterceptor)
有時候我們需要對請求做一些通用的攔截設置,這就可以使用攔截器進行處理。攔截器需要我們實現org.springframework.http.client.ClientHttpRequestInterceptor介面自己寫。
舉個簡單的例子,寫一個在header中根據請求內容和地址添加令牌的攔截器。
public class TokenInterceptor implements ClientHttpRequestInterceptor
{
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException
{
//請求地址
String checkTokenUrl = request.getURI().getPath();
//token有效時間
int ttTime = (int) (System.currentTimeMillis() / 1000 + 1800);
//請求方法名 POST、GET等
String methodName = request.getMethod().name();
//請求內容
String requestBody = new String(body);
//生成令牌 此處調用一個自己寫的方法,有興趣的朋友可以自行google如何使用ak/sk生成token,此方法跟本教程無關,就不貼出來了
String token = TokenHelper.generateToken(checkTokenUrl, ttTime, methodName, requestBody);
//將令牌放入請求header中
request.getHeaders().add("X-Auth-Token",token);

return execution.execute(request, body);
}
}

創建RestTemplate實例的時候可以這樣向其中添加攔截器
RestTemplate restTemplate = new RestTemplate();
//向restTemplate中添加自定義的攔截器
restTemplate.getInterceptors().add(new TokenInterceptor());

Ⅱ resttemplate怎麼上傳文件流

一、css代碼的次序不對 或許在你的印象中,css是無序的,可以隨意摻插,其實這種想法是錯誤的。如果你的css代碼含有多個相同的屬性,但每一個屬性都有不同的值,那麼瀏覽器會選擇哪個呢?譬如: body{background-color:red} body{background-col...

Ⅲ springmvc使用rest格式需要到什麼包

在使用springmvc提供rest介面實現文件上傳時,有時為了測試需要使用RestTemplate進行調用,那麼在使用RestTemplate調用文件上傳介面時有什麼特別的地方呢?實際上只需要注意一點就行了,就是創建文件資源時需要使用org.springframework.core.io.FileSystemResource類,而不能直接使用Java.io.File對象。

Controller中的rest介面代碼如下:

[java] view plain
@ResponseBody
@RequestMapping(value = "/upload.do", method = RequestMethod.POST)
public String upload(String fileName, MultipartFile jarFile) {
// 下面是測試代碼
System.out.println(fileName);
String originalFilename = jarFile.getOriginalFilename();
System.out.println(originalFilename);
try {
String string = new String(jarFile.getBytes(), "UTF-8");
System.out.println(string);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// TODO 處理文件內容...
return "OK";
}

使用RestTemplate測試上傳代碼如下:

[java] view plain
@Test
public void testUpload() throws Exception {
String url = "http://127.0.0.1:8080/test/upload.do";
String filePath = "C:\\Users\\MikanMu\\Desktop\\test.txt";

RestTemplate rest = new RestTemplate();
FileSystemResource resource = new FileSystemResource(new File(filePath));
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("jarFile", resource);
param.add("fileName", "test.txt");

String string = rest.postForObject(url, param, String.class);
System.out.println(string);
}

其中:

[java] view plain
String string = rest.postForObject(url, param, String.class);
可以換成:

[java] view plain
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String,Object>>(param);
ResponseEntity<String> responseEntity = rest.exchange(url, HttpMethod.POST, httpEntity, String.class);
System.out.println(responseEntity.getBody());

Ⅳ 報文編碼格式改為UTF-8

這兩天項目需要將報文以xml格式推送給核心,過程中使用到RestTemplate,並且在自己拼接xml時使用了StringBuffer;

StringBuffer的.toString()是不會生成UTF-8格式的String的。
new String(sb.toString().getByte("你當前的編碼方式"),"UTF-8");
這種方式我沒有測試過,因為我無法確定當前的編碼方式。
所以我選擇的是轉換為 byte[] bytes 後
String str = new String(bytes, "UTF-8");

在發送的時候,使用了RestTemplate的postForObject(),
而RestTemplate會使用StringHttpMessageConverter,其默認編碼集是ISO8859-1;
此時我選擇設置Http請求頭:

還有方法是在xml配置文件中配置restTempalate的Bean的StringHttpMessageConverter編碼;
這里由於項目原因我沒法在xml配置文件中直接修改。
我使用的方法不是單例模式的,修改xml配置文件是單例模式的。

Ⅳ 基於docker部署的微服務架構(二): 服務提供者和調用者

前一篇 基於docker部署的微服務架構(一):服務注冊中心 已經成功創建了一個服務注冊中心,現在我們創建一個簡單的微服務,讓這個服務在服務注冊中心注冊。然後再創建一個調用者,調用此前創建的微服務。

新建一個maven工程,修改pom.xml引入 spring cloud 依賴:

在 resources 目錄中創建 application.yml 配置文件,在配置文件內容:

這里eureka的注冊地址為上一篇中設置的defaultZone。
在 java 目錄中創建一個包 demo ,在包中創建啟動入口 AddServiceApplication.java

在demo包下新建一個子包controller,在controller子包下創建一個controller對外提供介面。

在服務注冊中心已經運行的情況下,運行 AddServiceApplication.java 中的 main 方法,啟動微服務。
訪問服務注冊中心頁面 http://localhost:8000 , 可以看到已經成功注冊了 ADD-SERVICE-DEMO 服務。

啟動第二個實例,修改埠為 8101 ,修改 AddController.java 中的輸出信息為

再次運行 AddServiceApplication.java 中的 main 方法。
訪問服務注冊中心頁面 http://localhost:8000 , 可以看到已經成功注冊了兩個 ADD-SERVICE-DEMO 服務,埠分別為 8100 8101

新建一個maven工程,修改pom.xml引入 spring cloud 依賴:

在 resources 目錄中創建 application.yml 配置文件,在配置文件內容:

在 java 目錄中創建一個包 demo ,在包中創建啟動入口 RibbonClientApplication.java

這里配置了一個可以從服務注冊中心讀取服務列表,並且實現了負載均衡的 restTemplate

在demo包下新建一個子包controller,在controller子包下創建一個controller對外提供介面。

可以看到這里的請求url用了服務注冊中心對應的 Application 。

運行 RibbonClientApplication.java 中的 main 方法,啟動項目。
在瀏覽器中訪問 http://localhost:8200/add?a=1&b=2 ,得到返回結果:

多次訪問,查看 AddServiceApplication 的控制台,可以看到兩個 ADD-SERVICE-DEMO 被負載均衡的調用。
demo源碼 spring-cloud-1.0/ribbon-client-demo

新建一個maven工程,修改pom.xml引入 spring cloud 依賴:

在 resources 目錄中創建 application.yml 配置文件,在配置文件內容:

在 java 目錄中創建一個包 demo ,在包中創建啟動入口 FeignClientApplication.java

在demo包下新建一個子包service,在service子包下創建一個介面 AddService.java 調用之前創建的微服務 ADD-SERVICE-DEMO

這里 @FeignClient 註解中的參數為服務注冊中心對應的 Application 。

在demo包下再新建一個子包controller,在controller子包下創建一個 FeignController.java 對外提供介面。

FeignController 里注入了剛才創建的 AddService 介面。

運行 FeignClientApplication.java 中的 main 方法,啟動項目。
在瀏覽器中訪問 http://localhost:8300/add?a=1&b=2 ,得到返回結果:

多次訪問,查看 AddServiceApplication 的控制台,可以看到兩個 ADD-SERVICE-DEMO 被負載均衡的調用。
demo源碼 spring-cloud-1.0/feign-client-demo

以 add-service-demo 為例,
復制 application.yml ,重命名為 application-docker.yml ,修改 defaultZone 為:

這里修改了 defaultZone 的訪問url,如何修改取決於部署docker容器時的 --link 參數, --link 可以讓兩個容器之間互相通信。

修改 application.yml 中的 spring 節點為:

這里增加了 profiles 的配置,在maven打包時選擇不同的profile,載入不同的配置文件。

在pom.xml文件中增加:

選擇 docker profile,運行 mvn install -P docker ,打包項目並生成docker鏡像, 注意docker-maven-plugin中的 <entryPoint> 標簽里的內容不能換行,否則在生成docker鏡像的時候會報錯
運行成功後,登錄docker節點,運行 docker images 應該可以看到剛才打包生成的鏡像了。

在前一篇中,已經創建了一個 service-registry-demo 的docker鏡像,這里先把這個鏡像運行起來。

對這條命令做個簡單說明, -d 指定當前容器運行在後台, --name 指定容器名稱, --publish 指定埠映射到宿主機, --volume 這個掛載是為了解決容器內的時區和宿主機不一致的問題,讓容器使用宿主機設置的時區,最後指定使用的docker鏡像,鏡像名稱和標簽需要根據自己的情況做修改。
運行這條命令之後, service-registry-demo 的容器就啟動了。訪問 http://宿主機IP:8000 ,打開注冊中心的頁面。
下邊啟動 add-service-demo 容器,

這條命令和上一條差不多,只是增加了一個 --link 參數, --link 指定容器間的連接,命令格式 --link 容器名:別名 ,這里連接了之前創建的名為 service-registry-demo 的容器,這里的別名和 application-docker.yml 文件中配置的 defaultZone 一致。其實就是通過別名找到了對應的容器IP,進到容器里查看 hosts 文件就明白了,其實就是加了條hosts映射。
add-service-demo 容器啟動成功之後,刷新配置中心的頁面,發現已經注冊到配置中心了。

Ⅵ resttemplate轉發佔用cpu

resttemplate轉發佔用cpu,可以包含3種:①瀏覽器和其它應用未關閉所造成的緩沖超負荷,②頁面過多.

Ⅶ resttemplate 500 internal server error怎麼解決

如果您上傳的PHP程序在運行後報「Internal Server Error」錯誤,請您注意檢查以下兩方面 1、請您檢查PHP程序的屬性是否設置為755,如果PHP程序的屬性不是755,那麼運行的時候會報「Internal Server Error」錯誤,請您使用FTP軟體將屬性更改為755再測試。 2、請您檢查PHP程序所在的當前目錄下是否有名為.htaccess的文件存在,此文件會干擾PHP程序的正常運行,如果發現有此文件建議您刪除或者改名後再測試。

熱點內容
androidvr播放器 發布:2025-05-19 15:55:32 瀏覽:963
我的世界pc如何創建伺服器 發布:2025-05-19 15:51:24 瀏覽:732
搶腳本 發布:2025-05-19 15:47:14 瀏覽:406
ct4哪個配置性價比最高 發布:2025-05-19 15:38:02 瀏覽:953
如何設置強緩存的失效時間 發布:2025-05-19 15:21:28 瀏覽:695
winxp無法訪問 發布:2025-05-19 15:19:48 瀏覽:947
文件預編譯 發布:2025-05-19 15:14:04 瀏覽:643
怎麼在伺服器上掛公網 發布:2025-05-19 15:14:02 瀏覽:272
濟南平安e通如何找回密碼 發布:2025-05-19 14:56:58 瀏覽:176
安卓手機如何找到iccid碼 發布:2025-05-19 14:46:51 瀏覽:227