2017-09-13 11 views
0

個人用プロジェクトのGWTフロントエンドを作成していますが、一部のHTTPリクエストに問題があります。POST GWT CORSリクエストは機能しますが、PUT CORSリクエストは受け付けません

General 
Request URL:https://[redacted].execute-api.eu-west-1.amazonaws.com/v1/students/ 
Request Method:OPTIONS 
Status Code:200 
Remote Address:54.230.9.41:443 
Referrer Policy:no-referrer-when-downgrade 

Response Headers 
access-control-allow-headers:content-type, lambda-authorization 
access-control-allow-methods:post, get, put 
access-control-allow-origin:* 
content-length:0 
content-type:application/json 
date:Wed, 13 Sep 2017 14:56:32 GMT 
status:200 
via:1.1 5db82aafd9021b07695423274288b59e.cloudfront.net (CloudFront) 
x-amz-cf-id:8nJ2gzqHFPiiDOOeEelzkpI7Ga9SFdEcljiLt2pvm7Z995_GicxPVw== 
x-amzn-requestid:bb0e23db-9893-11e7-bbbe-9bea7d9d70bf 
x-amzn-trace-id:sampled=0;root=1-59b94720-d892209d8c5c2a04832bdb85 
x-cache:Miss from cloudfront 

Request Headers 
:authority:[redacted].execute-api.eu-west-1.amazonaws.com 
:method:OPTIONS 
:path:/v1/students/ 
:scheme:https 
accept:*/* 
accept-encoding:gzip, deflate, br 
accept-language:en-GB,en-US;q=0.8,en;q=0.6 
access-control-request-headers:content-type,lambda-authorization 
access-control-request-method:POST 
origin:http://127.0.0.1:8888 
referer:http://127.0.0.1:8888/ArithmeticExerciseGeneratorClient.html 
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36 

予想通りその後、POST要求が発生します。私はCORS POSTリクエストを行う場合は、オプションのリクエストが200応答(以下クロームネットワーク検査)を取得

String url = BASE_URL + "students/"; 

RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url); 
builder.setHeader("Content-Type", "application/vnd.onelostlogician.student+json"); 
builder.setHeader("Accept", "application/json"); 
StringBuilder basicAuth = new StringBuilder(); 
basicAuth.append(username.getValue()); 
basicAuth.append(":"); 
basicAuth.append(password.getValue()); 
String basicAuthStr = basicAuth.toString(); 
builder.setHeader("Lambda-Authorization", "Basic " + toBase64(basicAuthStr.getBytes())); 
StudentWriter studentWriter = GWT.create(StudentWriter.class); 

try { 
    builder.sendRequest(studentWriter.write(student), new RequestCallback() { 
     public void onError(Request request, Throwable exception) { 
      addItemDialog.close(); 
      responseDialog.open(); 
      loadingIcon.setVisible(false); 
      responseHeading.setText("No response"); 
      responseLabel.setText(request.toString()); 
     } 

     public void onResponseReceived(Request request, Response response) { 
      loadingIcon.setVisible(false); 
      String responseText = response.getText(); 

      List<Map.Entry<Integer, Student>> students = model.getList(); 
      Integer studentId = Integer.parseInt(responseText); 

      students.add(new AbstractMap.SimpleEntry<>(studentId, student)); 
      model.setList(students); 

      // clear text fields 
      className.setValue(""); 
      additionLevel.setValue(""); 
      additionProblems.setValue(""); 
      subtractionLevel.setValue(""); 
      subtractionProblems.setValue(""); 
      multiplicationLevel.setValue(""); 
      multiplicationProblems.setValue(""); 
      divisionLevel.setValue(""); 
      divisionProblems.setValue(""); 

      addItemDialog.close(); 
     } 
    }); 

} catch (RequestException _) { 
    // Code omitted for clarity 
} 

正常に動作します

General 
Request URL:https://[redacted].execute-api.eu-west-1.amazonaws.com/v1/students/ 
Request Method:POST 
Status Code:201 
Remote Address:54.230.9.41:443 
Referrer Policy:no-referrer-when-downgrade 

Response Headers 
access-control-allow-origin:* 
content-length:1 
content-type:application/json 
date:Wed, 13 Sep 2017 14:56:33 GMT 
status:201 
via:1.1 5db82aafd9021b07695423274288b59e.cloudfront.net (CloudFront) 
x-amz-cf-id:gxYrwctM75ObiPyS4nD69jXSO4dBaMAOZmXXX0mPE4wMgCdcjUSQsA== 
x-amzn-requestid:bb381a33-9893-11e7-a1f1-17fd67ca388c 
x-amzn-trace-id:sampled=0;root=1-59b94720-1c1e3a8d8c9ce2741c789241 
x-cache:Miss from cloudfront 

Request Headers 
:authority:[redacted].execute-api.eu-west-1.amazonaws.com 
:method:POST 
:path:/v1/students/ 
:scheme:https 
accept:application/json 
accept-encoding:gzip, deflate, br 
accept-language:en-GB,en-US;q=0.8,en;q=0.6 
content-length:224 
content-type:application/vnd.onelostlogician.student+json 
lambda-authorization:Basic [redacted] 
origin:http://127.0.0.1:8888 
referer:http://127.0.0.1:8888/ArithmeticExerciseGeneratorClient.html 
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36 

Request Payload 
{"className":"6T","additionProblemId":4,"additionNoOfProblems":5,"subtractionProblemId":3,"subtractionNoOfProblems":5,"multiplicationProblemId":2,"multiplicationNoOfProblems":5,"divisionProblemId":1,"divisionNoOfProblems":5} 

同じサーバー上の非常に似たリソースへのPUTリクエストはありません。コードはほぼ同じです:

String url = BASE_URL + "students/" + studentId; 

RequestBuilder builder = new RequestBuilder(RequestBuilder.PUT, url); 
builder.setHeader("Content-Type", "application/vnd.onelostlogician.student+json"); 
builder.setHeader("Accept", "application/json"); 
StringBuilder basicAuth = new StringBuilder(); 
basicAuth.append(username.getValue()); 
basicAuth.append(":"); 
basicAuth.append(password.getValue()); 
String basicAuthStr = basicAuth.toString(); 
builder.setHeader("Lambda-Authorization", "Basic " + toBase64(basicAuthStr.getBytes())); 
StudentWriter studentWriter = GWT.create(StudentWriter.class); 

try { 
    builder.sendRequest(studentWriter.write(student), new RequestCallback() { 
     public void onError(Request request, Throwable exception) { 
      addItemDialog.close(); 
      responseDialog.open(); 
      loadingIcon.setVisible(false); 
      responseHeading.setText("No response"); 
      responseLabel.setText(request.toString()); 
     } 

     public void onResponseReceived(Request request, Response response) { 
      loadingIcon.setVisible(false); 
      responseDialog.open(); 
      loadingIcon.setVisible(false); 
      responseHeading.setText("Response: " + response.getStatusCode()); 
      responseLabel.setText(response.getText()); 
     } 
    }); 

} catch (RequestException _) { 
    // Code omitted for clarity 
} 

オプション要求は200応答を取得:

General 
Request URL:https://[redacted].execute-api.eu-west-1.amazonaws.com/v1/students/4 
Request Method:OPTIONS 
Status Code:200 
Remote Address:54.230.9.41:443 
Referrer Policy:no-referrer-when-downgrade 

Response Headers 
access-control-allow-headers:content-type, lambda-authorization 
access-control-allow-methods:get, put 
access-control-allow-origin:* 
content-length:0 
content-type:application/json 
date:Wed, 13 Sep 2017 14:58:38 GMT 
status:200 
via:1.1 5db82aafd9021b07695423274288b59e.cloudfront.net (CloudFront) 
x-amz-cf-id:0PoyOa6oDBSmU7iCWZyeSZFqWxZvumN8C4GtHn8rsoJK5AURbj3kxQ== 
x-amzn-requestid:063270d4-9894-11e7-9d66-71b07b2689ef 
x-amzn-trace-id:sampled=0;root=1-59b9479e-39be94b25784b92027fa2753 
x-cache:Miss from cloudfront 

Request Headers 
:authority:[redacted].execute-api.eu-west-1.amazonaws.com 
:method:OPTIONS 
:path:/v1/students/4 
:scheme:https 
accept:*/* 
accept-encoding:gzip, deflate, br 
accept-language:en-GB,en-US;q=0.8,en;q=0.6 
access-control-request-headers:content-type,lambda-authorization 
access-control-request-method:PUT 
origin:http://127.0.0.1:8888 
referer:http://127.0.0.1:8888/ArithmeticExerciseGeneratorClient.html 
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36 

が...しかし、成功したOPTIONS応答を受け取った後、それがすべてでPUT要求を作成しません。クロームコンソールで

私が取得:

XMLHTTPRequestをがhttps://[redacted]/v1/students/5をロードすることはできません。この方法 PUTは、プリフライト 応答

にアクセス制御許法で許可されていない私は、そのエラーを理解していない、我々はプリフライトOPTIONS要求に対するaccess-control-allow-methodsレスポンスヘッダに「put」を見ることができることを考えます上に示しました。

私が間違っていることは何ですか? POSTレスポンスで

+0

あなたが言った質問の部分では、「必要なPUT CORS操作を実行することはできません」*、https://stackoverflow.com/posts/46202370/editを編集/あなたがそこに何を意味するのかを明確にするために質問を更新してください。ブラウザのdevtoolsでネットワークペインを開き、リロードして見て、戻って質問に戻りたいと思うでしょう。(1)ブラウザはOPTIONSの後にPUTリクエストを実際に送信しませんか?それとも? (2)サーバーがそのPUT要求に応答して送信するレスポンス・ステータス・コード(2xx、4xx、5xx?)とヘッダーは何ですか? – sideshowbarker

+0

説明のために編集されています。ブラウザはOPTIONSの後にPUT要求をまったく送信しません。 – user1853665

+0

ブラウザエンジンは何のエラーメッセージも記録しませんか? GWTのトラブルシューティングの仕組みに慣れていないと申し訳ありませんが、エラーが記録されるコンソールはありませんか?もしそこにエラーが記録されていなければ?そして、あなたは別のブラウザでコードのいくつかのバージョンをテストすることができますか? Firefox?(PUTリクエストの送信と同じ動作をするかどうかを確認する) – sideshowbarker

答えて

0

、許可メソッドヘッダはPUT応答に

access-control-allow-methods:post, get, put 

で、許可された方法のヘッダは、必要な方法は、リストの最初であることを

access-control-allow-methods:get, put 

。注POSTの場合ですが、PUTの場合は2番目です。 HTTPメソッド名で大文字と小文字が区別されるため、メソッドを最初にリストに入れるようにサーバーを変更したときに、ブラウザは必要なフォローアップPUT要求を実行しました。

関連する問題